AWS CloudShell 環境に GitHub CLI を導入する

AWS CloudShell 環境に GitHub CLI を導入する

Clock Icon2024.12.10

こんにちは、製造ビジネステクノロジー部の若槻です。

AWS CloudShell を利用すると、AWS マネジメントコンソールからアクセスできるブラウザベースのターミナルを使用して、AWS CLI などの各種コマンドを実行することができます。

https://aws.amazon.com/jp/cloudshell/

新規利用開始が終了となった AWS Cloud9 の移行先として、ハンズオン環境などに CloudShell の採用を検討される方も多いのではないでしょうか。

https://aws.amazon.com/jp/blogs/news/how-to-migrate-from-aws-cloud9-to-aws-ide-toolkits-or-aws-cloudshell/

今回は、そんな AWS CloudShell 環境に GitHub CLI を導入する機会があったので、方法を確認してみました。

GitHub CLI とは

Git を利用した開発時に作業内容のコミットやプッシュなどを行うためには Gitgit コマンドを利用すると思いますが、それに加えて GitHub CLI の gh コマンドを利用することで、GitHub の機能をコマンドラインから利用することができます。

https://docs.github.com/ja/github-cli/github-cli/about-github-cli

GitHub CLI を使うと GitHub 上のリポジトリや Issue、プルリクエストなどを操作することができて便利ですが、このツールを使うべき最も大きな理由はブラウザベースでの認証により取得したトークンを gh および git コマンドで利用できる点にあります。git コマンドのみの場合は予め作成した Personal Access Token や SSH キーを使用する必要がありセキュリティ上のリスクや煩雑さがありますが、GitHub CLI を使用すると gh auth login 実行時のインタラクティブな操作のみでトークンの取得とセットを行うことができます。

この GitHub CLI をせっかくなので CloudShell 環境でも利用可能としたいですね。

やってみた

CloudShell へのアクセス

何はともあれまずはマネジメントコンソールから CloudShell にアクセスします。

ちなみに CloudShell 自体の利用に料金は掛かりません。

https://aws.amazon.com/cloudshell/pricing/

GitHub CLI のインストール

CloudShell 環境には git コマンドはインストール済みですが、GitHub CLI はインストールされていません。

$ git --version
git version 2.40.1
$ gh --version
bash: gh: command not found

OS は Amazon Linux 2023 となっています。

$ uname -r
6.1.115-126.197.amzn2023.x86_64

GitHub CLI のインストール手順を確認してみると、Amazon Linux 2023 の手順はなく、Amazon Linux 2 の手順はあったので、それを試してみます。

https://github.com/cli/cli/blob/trunk/docs/install_linux.md#amazon-linux-2-yum

手順に沿ってコマンドを実行していきます。

type -p yum-config-manager >/dev/null || sudo yum install yum-utils
sudo yum-config-manager --add-repo https://cli.github.com/packages/rpm/gh-cli.repo
sudo yum install gh

GitHub CLI をインストールできたようです。

$ gh --version
gh version 2.63.2 (2024-12-05)
https://github.com/cli/cli/releases/tag/v2.63.2

参考

https://dev.classmethod.jp/articles/aws-cloudshell-migrated-al2023/

GitHub CLI のログイン

GitHub CLI のログインは gh auth login コマンドにより行います。前述の通りこれにより取得およびセットされたトークンは gh および git コマンドで利用可能となります。

それではコマンドを実行してログインを試してみます。

しかし How would you like to authenticate GitHub CLI で Login with a web browser を選択してブラウザによる認証を行おうとすると認証が失敗しました。CloudShell からブラウザ画面を開けなかったようです。ローカル環境などの場合はすんなり開くのですが。

$ gh auth login
? Where do you use GitHub? GitHub.com
? What is your preferred protocol for Git operations on this host? HTTPS
? Authenticate Git with your GitHub credentials? Yes
? How would you like to authenticate GitHub CLI? Login with a web browser

! First copy your one-time code: 24C0-5D82
Press Enter to open https://github.com/login/device in your browser...
! Failed opening a web browser at https://github.com/login/device
  exec: "xdg-open,x-www-browser,www-browser,wslview": executable file not found in $PATH
  Please try entering the URL in your browser manually

そこで、URL https://github.com/login/device を直接ブラウザで開いて、ターミナル上に表示されたコードを入力します。

CloudShell のターミナルに戻ると、認証に成功したようです。

! First copy your one-time code: 24C0-5D82
Press Enter to open https://github.com/login/device in your browser...
! Failed opening a web browser at https://github.com/login/device
  exec: "xdg-open,x-www-browser,www-browser,wslview": executable file not found in $PATH
  Please try entering the URL in your browser manually
✓ Authentication complete.
- gh config set -h github.com git_protocol https
✓ Configured git protocol
! Authentication credentials saved in plain text
✓ Logged in as cm-rwakatsuki

gh コマンドでリポジトリをクローンしてみる

GitHub CLI の認証もできたことなので、認証が必要な操作としてプライベートな GitHub リポジトリをクローンしてみます。

gh repo clone コマンドを使用すると、上手くクローンできました。

$ gh repo clone classmethod-internal/icasu-cdk-serverless-api-sample
Cloning into 'icasu-cdk-serverless-api-sample'...
remote: Enumerating objects: 4407, done.
remote: Counting objects: 100% (1189/1189), done.
remote: Compressing objects: 100% (728/728), done.
remote: Total 4407 (delta 568), reused 725 (delta 443), pack-reused 3218 (from 1)
Receiving objects: 100% (4407/4407), 3.46 MiB | 16.57 MiB/s, done.
Resolving deltas: 100% (2420/2420), done.

$ ls
icasu-cdk-serverless-api-sample

$ cd icasu-cdk-serverless-api-sample/

$ ls
cspell.json  docs  package.json  package-lock.json  packages  README.md  tsconfig.json

git コマンドでコミット、プッシュしてみる

Git の基本ではあるのですが、Git を使い始める際に git config コマンドで開発者の情報を設定する必要があります。

https://git-scm.com/book/ja/v2/使い始める-最初のGitの構成

例えば設定をしないままコミットをしようとすると次のようにエラーとなります。

$ git checkout -b test-20241210
Switched to a new branch 'test-20241210'
$ touch hoge.txt
$ git add .
$ git commit -m "Test"
Author identity unknown

*** Please tell me who you are.

Run

  git config --global user.email "you@example.com"
  git config --global user.name "Your Name"

to set your account's default identity.
Omit --global to set the identity only in this repository.

fatal: empty ident name (for <cloudshell-user@ip-10-132-73-171.ap-northeast-1.compute.internal>) not allowed

git config コマンドで開発者の情報を設定します。

$ git config --global user.email wakatsuki.ryuta@example.com
$ git config --global user.name "Ryuta Wakatsuki"

設定後であればコミットは行うことができました。またプッシュもできたので GitHub CLI で設定した認証情報が git コマンドでも利用されていることが確認できました。

$ git commit -m "Test"
[test-20241210 0dadb0c] Test
 1 file changed, 0 insertions(+), 0 deletions(-)
 create mode 100644 hoge.txt

$ git push origin HEAD
Enumerating objects: 4, done.
Counting objects: 100% (4/4), done.
Delta compression using up to 2 threads
Compressing objects: 100% (2/2), done.
Writing objects: 100% (3/3), 275 bytes | 137.00 KiB/s, done.
Total 3 (delta 1), reused 1 (delta 0), pack-reused 0
remote: Resolving deltas: 100% (1/1), completed with 1 local object.
remote:
remote: Create a pull request for 'test-20241210' on GitHub by visiting:
remote:      https://github.com/classmethod-internal/icasu-cdk-serverless-api-sample/pull/new/test-20241210
remote:
To https://github.com/classmethod-internal/icasu-cdk-serverless-api-sample.git
 * [new branch]      HEAD -> test-20241210

gh コマンドは永続ストレージに保存されない

AWS CloudShell では $HOME ディレクトリを 1GB の永続ストレージとして無料で利用可能です。それ以外のディレクトリはシェルセッションが終了すると削除されます。

$HOME ディレクトリは既定では /home/cloudshell-user となります。

$ echo $HOME
/home/cloudshell-user

そしてシェルセッションを再度開始後に確認すると、クローンしたリポジトリのディレクトリは残っていますが、gh コマンドは削除されてしまっています。

$ ls
icasu-cdk-serverless-api-sample
$ gh --version
bash: gh: command not found

GitHub の認証情報も削除されているので、リモートリポジトリにプッシュをしようとするとユーザー名とパスワードを求めらます。

$ git push origin HEAD
/usr/bin/gh auth git-credential get: line 1: /usr/bin/gh: No such file or directory
Username for 'https://github.com':
Password for 'https://github.com':
/usr/bin/gh auth git-credential erase: line 1: /usr/bin/gh: No such file or directory
remote: Repository not found.

GitHub CLI のインストール手順を再度実施します。

type -p yum-config-manager >/dev/null || sudo yum install yum-utils
sudo yum-config-manager --add-repo https://cli.github.com/packages/rpm/gh-cli.repo
sudo yum install gh

インストールできました。

$ which gh
/usr/bin/gh
$ gh --version
gh version 2.63.2 (2024-12-05)
https://github.com/cli/cli/releases/tag/v2.63.2

リモートリポジトリへのプッシュ操作も行うことができました。

$ git push origin HEAD
Enumerating objects: 3, done.
Counting objects: 100% (3/3), done.
Delta compression using up to 2 threads
Compressing objects: 100% (2/2), done.
Writing objects: 100% (2/2), 232 bytes | 232.00 KiB/s, done.
Total 2 (delta 1), reused 0 (delta 0), pack-reused 0
remote: Resolving deltas: 100% (1/1), completed with 1 local object.
To https://github.com/classmethod-internal/icasu-cdk-serverless-api-sample.git
   0dadb0c..0ffc6bd  HEAD -> test-20241210

逐一インストールするのは面倒かも知れませんが、一時的な作業環境であるという CloudShell の性質上、このような仕様は仕方ないのかもしれません。

参考

https://docs.aws.amazon.com/ja_jp/cloudshell/latest/userguide/limits.html#persistent-storage-limitations

おわりに

AWS CloudShell 環境に GitHub CLI を導入する機会があったので方法をご紹介しました。

本記事がどなたかの参考になれば幸いです。

以上

Share this article

facebook logohatena logotwitter logo

© Classmethod, Inc. All rights reserved.